package com.mikelouis.test.scala.proginscala.chapter3

import scala.io.Source

/**
 * Created by yuazhu on 12/18/2014.
 */
object file {
  def main(args: Array[String]) {
    if (args.length > 0) {
      //      printFileV1(args(0))
      printFileV2(args(0))
    } else {
      Console.err.println("Please enter filename")
    }
  }

  def printFileV1(fileName: String) = {
    for (line <- Source.fromFile(fileName).getLines()) {
      println(line.length + " " + line)
    }
  }

  def printFileV2(fileName: String) = {
    // getLines方法返回的是枚举器。一旦你使用它完成遍历，枚举器就失效了。而通过调用toList把它转换为List，你就可以枚举任意次数，代价就是把文件中的所有行一次性贮存在内存里
    val lines = Source.fromFile(fileName).getLines().toList
    // 首先找到最长的一行
    // reduceLeft方法把传入的方法应用于lines的前两个元素，然后再应用于第一次应用的结果和lines接下去的一个元素，等等，直至整个列表
    val longestLine = lines.reduceLeft((a, b) => if (a.length > b.length) a else b)

    // 把最长一行传给widthOfLength计算最大的宽度
    val maxWidth = widthOfLength(longestLine)
    for (line <- lines) {
      // numSpaces创建包含numSpaces个空格的字串
      val numSpaces = maxWidth - widthOfLength(line)
      val padding = " " * numSpaces
      println(padding + line.length + "| " + line)
    }
  }

  /**
   * 计算传入字串的字符长度
   * @param s string to calculate length
   * @return length
   */
  def widthOfLength(s: String): Int = s.length.toString.length


}
